//
// JTBlock
//
// Copyright (C) jextra.net.
//
//  This file is part of the JavaTemplar Library.
//
//  The JavaTemplar Library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//
//  The JavaTemplar Library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with the JavaTemplar Library; if not, write to the Free
//  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
//  02111-1307 USA.
//

package net.jextra.javatemplar.token;

import java.io.*;
import java.util.*;

/**
 * <p>
 * An actual instance of a {@link JTBlockStencilToken}.
 * </p>
 */
public class JTBlock
{
    // ============================================================
    // Fields
    // ============================================================

    private ArrayList<JTToken> _tokens;

    // ============================================================
    // Constructors
    // ============================================================

    public JTBlock()
    {
        _tokens = new ArrayList<JTToken>();
    }

    // ============================================================
    // Methods
    // ============================================================

    // ----------
    // public
    // ----------

    @Override
    public JTBlock clone()
    {
        JTBlock copy = new JTBlock();

        // Copy all of the children to the new clone.
        for ( JTToken token : _tokens )
        {
            copy.addToken( token.clone() );
        }

        return copy;
    }

    /**
     * Add a child token to this block.
     */
    public void addToken( JTToken token )
    {
        _tokens.add( token );
    }

    public List<JTToken> getTokens()
    {
        return _tokens;
    }

    public void write( Writer out )
        throws Exception
    {
        for ( JTToken token : _tokens )
        {
            token.write( out );
        }
    }

    /**
     * Sets the value associated with any variables with the given name to the value. Note, this
     * is a recursive call; it calls this same method on all children {@link JTToken}s.
     */
    public JTBlock setVariable( String variableName, String value )
    {
        //
        // Propogate through the children to set the variable value
        //
        for ( JTToken token : _tokens )
        {
            if ( token instanceof JTBlockStencilToken )
            {
                JTBlockStencilToken stencil = (JTBlockStencilToken)token;

                stencil.setVariable( variableName, value );
            }
            else if ( token instanceof JTVariableToken )
            {
                JTVariableToken var = (JTVariableToken)token;

                if ( variableName.equals( var.getName() ) )
                {
                    var.setValue( value );
                }
            }
        }

        return null;
    }
}

